package cn.e3mall.cart.service.impl;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.alibaba.druid.support.json.JSONUtils;

import cn.e3mall.cart.service.CartService;
import cn.e3mall.common.jedis.JedisClient;
import cn.e3mall.common.utils.E3Result;
import cn.e3mall.common.utils.JsonUtils;
import cn.e3mall.mapper.TbItemMapper;
import cn.e3mall.pojo.TbItem;
@Service
public class CartServiceImpl implements CartService{

	@Autowired
	private JedisClient jedisClient;
	
	@Autowired
	private TbItemMapper itemMapper;
	
	@Value("${CART_PRE}")
	private String CART_PRE;	//有购物车的用户id前缀
	
	@Override
	public E3Result addCart(Long userId, Long ItemId, Integer num) {
		//不需要判断用户id是否存在，能进行到这的，用户已经登录
		//查询商品是否存在
		Boolean exist = jedisClient.hexists(CART_PRE+":"+userId, ItemId+"");
		
		//商品存在则数量相加
		if(exist) {
			//获取商品
			String item_str = jedisClient.hget(CART_PRE+":"+userId, ItemId+"");
			//商品转为java对象
			TbItem item = JsonUtils.jsonToPojo(item_str, TbItem.class);
			//设置数量
			item.setNum(item.getNum() + num);
			//转为字符串写入到redis
			jedisClient.hset(CART_PRE+":"+userId, ItemId+"", JsonUtils.objectToJson(item));
			
			return E3Result.ok();
		}
		
		//不存在则查询商品信息
		TbItem item = itemMapper.selectByPrimaryKey(ItemId);
		
		//设置商品数量
		item.setNum(num);
		
		//设置图片
		String image = item.getImage();
		if(StringUtils.isNotBlank(image)) {	//若图片不空
			//取一张
			item.setImage(image.split(",")[0]);
		}
		
		//将商品信息写到redis中
		jedisClient.hset(CART_PRE+":"+userId, ItemId+"",JsonUtils.objectToJson(item));
		
		return E3Result.ok();
	}

	@Override
	public E3Result mergeCart(Long userId, List<TbItem> cartList) {
		//遍历购物车列表，把商品添加到redis中
		
		//遍历过程中判断商品是否存在，存在则数量相加
		
		//不存在就查询商品并添加到redis的购物车列表
		for(TbItem item :cartList) {
			addCart(userId,item.getId(),item.getNum());
		}
		return E3Result.ok();
	}

	@Override
	public List<TbItem> getCartListFromDB(Long userId) {
		//获取购物车列表
		List<String> itemList = jedisClient.hvals(CART_PRE+":"+userId);
		
		List<TbItem> list = new ArrayList<TbItem>();
		
		//遍历购物车列表
		for(String item:itemList) {
			//将商品字符串转为对象
			TbItem tbItem = JsonUtils.jsonToPojo(item, TbItem.class);
			//添加列表中
			list.add(tbItem);
		}
		
		return list;
	}

	@Override
	public E3Result deleteItemFromDBCart(Long userId, Long itemId) {
		
		//删除商品
		jedisClient.hdel(CART_PRE+":"+userId, itemId+"");
		
		return E3Result.ok();
	}

	@Override
	public E3Result updateItemNumFromDBCart(Long userId, Long itemId, Integer num) {
		//取商品
		String item_str = jedisClient.hget(CART_PRE+":"+userId, itemId+"");
		
		//转为java对象
		TbItem item = JsonUtils.jsonToPojo(item_str, TbItem.class);
		//修改商品数量
		item.setNum(num);
		
		//设置到购物车中
		jedisClient.hset(CART_PRE+":"+userId, itemId+"", JsonUtils.objectToJson(item));
		
		return E3Result.ok();
	}

	@Override
	public E3Result clearCartItem(Long userId) {
		//删除用户的购物车列表
		jedisClient.del(CART_PRE+":"+userId);
		
		return E3Result.ok();
	}
	
}
